package com.cskaoyan.service.front.auth;


import com.aliyuncs.exceptions.ClientException;
import com.cskaoyan.bean.bo.front.login.LoginBo;
import com.cskaoyan.bean.po.MarketUser;
import com.cskaoyan.bean.po.MarketUserExample;
import com.cskaoyan.bean.vo.front.login.LoginData;
import com.cskaoyan.bean.vo.front.login.LoginInfo;
import com.cskaoyan.bean.vo.front.register.RegisterBo;
import com.cskaoyan.mapper.MarketUserMapper;
import com.cskaoyan.util.SMSUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * 用户登录服务impl
 *
 * @author 李然
 * @date 2022/10/13
 */
@Service
public class UserLoginServiceImpl implements UserLoginService {

    @Autowired
    MarketUserMapper userMapper;

    @Autowired
    SMSUtil smsUtil;


    /**
     * 登录
     *
     * @param loginBo 用户名、密码对象
     * @return LoginData
     */
    @Override
    public LoginData login(LoginBo loginBo) {
        // 通过用户名和密码获取用户信息并返回
        MarketUserExample userExample = new MarketUserExample();
        userExample.createCriteria().andUsernameEqualTo(loginBo.getUsername())
                .andPasswordEqualTo(loginBo.getPassword());

        List<MarketUser> users = userMapper.selectByExample(userExample);
        MarketUser user = users.get(0);

        String avatar = user.getAvatar();
        String nickname = user.getNickname();

        // 用户信息
        LoginInfo loginInfo = new LoginInfo();
        loginInfo.setAvatarUrl(avatar);
        loginInfo.setNickName(nickname);

        // 返回用户数据
        LoginData loginData = new LoginData();
        loginData.setUserInfo(loginInfo);
        return loginData;
    }

    // TODO: 2022/10/13  //    autu/ 下面还有注册发送短信等选做

    /**
     * solution:
     */

    @Override
    public int resetPasswordByMobile(RegisterBo params) {
        // 查询user
        MarketUserExample userExample = new MarketUserExample();
        userExample.createCriteria().andMobileEqualTo(params.getMobile());
        List<MarketUser> users = userMapper.selectByExample(userExample);

        // 校验users
        if (users.size() == 0) {
            return 0;
        }
        users.get(0).setPassword(params.getPassword());
        return userMapper.updateByPrimaryKey(users.get(0));

    }

    /**
     * 发送验证码  + 数据库中添加验证码
     * ★将验证码放到数据库中
     *
     * @param phone 手机号码
     * @param code  验证码
     */

    @Override
    public void sendMessage(String phone, String code, HttpServletRequest requests) throws ClientException {
//        发送验证码
        smsUtil.sendShortMessage(phone, code);

//        添加到context域中
        ServletContext servletContext = requests.getServletContext();
        HashMap<String, Long> reg = (HashMap<String, Long>) servletContext.getAttribute("reg");

        if (reg == null) {
            // 如果context域中没有reg
            reg = new HashMap<>();
            servletContext.setAttribute("reg", reg);
        }

        // 添加时间
        Long addTime = new Date().getTime();
        reg.put(code, addTime);
    }

    /**
     * 注册账号的逻辑
     *
     * @param registerBo 注册信息
     */
    @Override
    public int authRegister(RegisterBo registerBo, HttpServletRequest request) {
        //参数校验 username不能重复
//                 号码不能重复
        MarketUserExample userExample = new MarketUserExample();
        MarketUserExample.Criteria userExampleCriteria = userExample.createCriteria();
        userExampleCriteria.andUsernameEqualTo(registerBo.getUsername());

        List<MarketUser> users = userMapper.selectByExample(userExample);
        if (!users.isEmpty()) {
            // username重复了
            return 701;
        }


//        获得context域
        ServletContext servletContext = request.getServletContext();
        HashMap<String, Long> reg = (HashMap<String, Long>) servletContext.getAttribute("reg");

        if (reg == null) {
            // reg为空 放入新的然后返回结果
            reg = new HashMap<>();
            servletContext.setAttribute("reg", reg);
            return 703;
        }

        // 获得添加时间 并移除
        Long addTime = reg.remove(registerBo.getCode());
        if (addTime == null) {
            // 验证码错误
            return 703;
        }

        // 验证码正确 查看有没有超时
        // 将超时时间转换为Long
        long tempTime = 5 * 60 * 1000;
        // 现在的时间
        long nowTime = new Date().getTime();
        // 判断添加的时间＋超时时间有没有大于现在的时间
        if ((addTime + tempTime) < nowTime) {
            // 验证码超时了
            return 703;
        }
        // 验证码正确

//        号码不能重复
        MarketUserExample userExample1 = new MarketUserExample();
        MarketUserExample.Criteria criteria = userExample1.createCriteria();
        criteria.andMobileEqualTo(registerBo.getMobile());

        List<MarketUser> users1 = userMapper.selectByExample(userExample1);
        if (!users1.isEmpty()) {
            // mobile 重复
            return 702;
        }

//        为user赋值
        MarketUser user = new MarketUser();
        // 设置用户名称
        user.setUsername(registerBo.getUsername());
        // 设置用户密码
        user.setPassword(registerBo.getPassword());
        // 设置性别
        user.setGender((byte) 1);
        // 设置生日(默认当日)
        user.setBirthday(new Date());
        // 最近一次登陆时间
        user.setLastLoginTime(new Date());
        // 设置用户最近一次登录的IP地址
        String remoteHost = request.getRemoteHost();
        user.setLastLoginIp(remoteHost);
        // 设置用户的级别(默认0)
        user.setUserLevel((byte) 0);
        // 设置用户用户昵称（默认username）
        user.setNickname(registerBo.getUsername());
        // 设置手机号码
        user.setMobile(registerBo.getMobile());
        // 设置用户头像(默认)
        user.setAvatar("https://www.bing.com/th/id/OGC.1ae8f5357e4471347719f4f2d1f21926?pid=1.7&rurl=https%3a%2f%2fimg1.libangzdh.com%2fs1007%2fglpic%2f2022%2f07%2f01%2f584_2022070160157615.gif&ehk=LheS4nDrfajEmZ5kT8433qdKPRS5WQltbNVnceoeiiM%3d");
        // 设置微信登录openId
        user.setWeixinOpenid(registerBo.getWxCode());
        // 设置微信登录会话key
        String sessionId = request.getSession().getId();
        user.setSessionKey(sessionId);
        // 设置登录状态
        user.setStatus((byte) 0);
        // 设置创建时间
        user.setAddTime(new Date());
        // 设置更新时间
        user.setUpdateTime(new Date());
        // 设置逻辑删除
        user.setDeleted(false);
        // 添加到数据库中
        userMapper.insertSelective(user);

        return 0;
    }

}
